import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import crypto from 'crypto';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    hashFilenamePlugin(),
  ],

  resolve: {
    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

// 根据文件内容生成文件名hash
function hashFilenamePlugin() {
  return {
    name: 'custom-hash-plugin',
    /* augmentChunkHash(chunkInfo) {
      console.log(chunkInfo)
      if (chunkInfo.name === 'foo') {
        return Date.now().toString();
      }
    } */
    generateBundle(options, bundle) {
      for (const fileName in bundle) {
        const file = bundle[fileName];

        // 仅处理 JS 和 CSS 文件
        if (file.type === 'chunk' || file.type === 'asset') {
          // 获取文件所在目录
          let dir = '';
          const lastSeparatorPos = file.fileName.lastIndexOf('/');
          if (lastSeparatorPos > -1) {
            dir = file.fileName.slice(0, lastSeparatorPos + 1)
          }

          const content = file.code || file.source; // JS chunks 使用 code, 其他静态资源用 source
          const hash = generateCustomHash(content); // 生成 hash

          // 生成新的文件名，插入自定义 hash
          const ext = fileName.split('.').pop();

          // 重命名文件
          file.fileName = `${dir}${file.name}-${hash}.${ext}`;
        }
      }
    }
  };
}

// 自定义 hash 生成函数
function generateCustomHash(content) {
  return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
}